WorkSpaces を 自前Active Directory に接続して立ち上げてみよう!
はじめに
くどうです。
WorkSpaces が Public Preview として公開されました。
この投稿ではActive Directoryに接続してWorkSpacesの立ち上げまでを書いています。
設定などは下記のドキュメントを参考に行っています。
Connect Amazon WorkSpaces to Your Directory
ただし、オンプレ環境は使用せずActive DirectoryもEC2上で利用する構成になっています。
Active Directoryもより実環境に近づけるためAZを分けた冗長構成でいます。
ここも参考に Amazon WorkSpacesがPublic Previewになった!のでやってみた!
構成図
Active Directoryの設定
WorkSpacesをActive Directoryへ接続する前に設定を行う必要があります。
ただし、Active Directoryは構成図のようにAZが分けられ構成されているものとします。
最初に、セキュリティグループに設定するポートを確認します。
Port | Type of Traffic |
---|---|
TCP 53 | DNS |
TCP 88 | Kerberos |
TCP 135 | EPM |
TCP 139 | NetBIOS Session Service |
TCP 389 | LDAP |
TCP 445 | DFS, LsaRpc, NbtSS, NetLogonR, SamR, SMB, SrvSvc |
TCP 464 | Kerberos Change/Set Password |
TCP 636 | LDAPS |
TCP 3268 | GC, LDAP |
TCP 3269 | GC, LDAPS |
TCP 5722 | DFS-R |
TCP 9389 | Active Directory Web Services |
UDP 53 | DNS |
UDP 88 | Kerberos |
UDP 123 | NTP |
UDP 137 | NetBIOS Name Service |
UDP 138 | NetBIOS Datagram Service |
UDP 389 | C-LDAP |
UDP 445 | SMB |
UDP 464 | Kerberos Change/Set Password |
UDP 2535 | MADCAP |
事前に任意のセキュリティグループを作成し、Active Directory に適用します。
WorkSpaces用のグループを作成します。
ドメインルートを右クリックし新規作成→グループ
以下の値でグループを作成します。
フィールド | 値 |
---|---|
グループ名 | WorkSpaces_Connectors |
グローバルのスコープ | グローバル |
グローバルの種類 | セキュリティ |
オブジェクト制御の委任ウィザードの開始。
ユーザまたはグループの追加画面へ進み追加します。
オブジェクトの種類は、ユーザー、コンピューターまたはグループを選択し、オブジェクト名に WorkSpaces_Connectors を入力し追加します。
委任するタスクは、すべてのユーザー情報の読み取り、コンピューターのドメインへの参加をチェックする。
これでウィザードを完了します。
次に、接続確認を行います。
接続確認には下記のツールPortQry をダウンロードします。
PortQry Command Line Port Scanner Version 2.0
PowerShellを起動し、Set-ExecutionPolicy Unrestricted を実行します。”Y”を入力します。 [PowerShell] PS C:\Users\Administrator.HOGE> Set-ExecutionPolicy Unrestricted
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (http://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y) [N] いいえ(N) [S] 中断(S) [?] ヘルプ (既定値は "Y"): Y
[/PowerShell]
PortQryV2の場所をPathに加えます。
[PowerShell]
PS C:/> $env:Path = "C:\PortQryV2"
[/PowerShell]
以下をコピーしてPowerShellスクリプトファイル(.ps1)として保存します。
[PowerShell]
<# Verify the ports and credentials. #>
$groups = @("domain admins","enterprise admins")
$members = @()
$memberNames = @()
$hasPrivilege = $False
$domainName = Read-Host "Please enter the domain name"
$cred = Get-Credential
$username = $cred.Username
$password = $cred.GetNetWorkCredential().password
$assem = ("System.DirectoryServices.AccountManagement", "System") $source = @" using System; using System.Collections.Generic; using System.DirectoryServices.AccountManagement;
public class groupsOfUser {
public List
Add-Type -ReferencedAssemblies $assem -TypeDefinition $source $getGroupsObject = New-Object groupsOfUser;
<# Check account credentials. #> Write-Host "======================================="; Write-Host "Checking domain name, user name, and password `n"; try { $groups = $getGroupsObject.getGroups($domainName, $username, $password); } catch [Exception] { Write-Host $_.Exception.ToString() "`n" -ForegroundColor red; } $groupNames = @(); $count = 0; while($groups[$count] -ne $null) { $groupNames += $groups[$count].name; $count++; }
<# Check forest functional level. #> Write-Host "======================================="; Write-Host "Checking forest functional level `n"; try { $ForestContext = New-Object System.DirectoryServices.ActiveDirectory.DirectoryContext("Forest", $domainName, $username, $password); $Forest = [System.DirectoryServices.ActiveDirectory.Forest]::GetForest($ForestContext); } catch [Exception] { Write-Host $_.Exception.ToString() "`n" -ForegroundColor red; } Write-Host "`n The forest functional level is" $Forest.ForestMode; if($Forest.ForestMode -ge "Windows2008R2Forest") { Write-Host "`n The forest functional level is correct. `n" -ForegroundColor green; } else { Write-Host "`n The forest functional level must be Windows2008R2Forest or greater. You cannot connect to the directory! `n" -ForegroundColor red; }
<# Check domain functional level. #> Write-Host "======================================="; Write-Host "Checking domain functional level. `n"; try { $DomainContext = New-Object System.DirectoryServices.ActiveDirectory.DirectoryContext("Domain", $domainName, $username, $password); $Domain = [System.DirectoryServices.ActiveDirectory.Domain]::GetDomain($DomainContext); } catch [Exception] { Write-Host $_.Exception.ToString() "`n" -ForegroundColor red; } Write-Host "`n The domain functional level is:" $Domain.DomainMode; if($Domain.DomainMode -ge "Windows2008R2Domain") { Write-Host "`n The domain functional level is correct. `n" -ForegroundColor green; } else { Write-Host "`n The domain functional level must be Windows2008R2Domain or greater. You cannot connect to the directory! `n" -ForegroundColor red; }
<# Verify identity of customer. #> Write-Host "======================================="; Write-Host "Verifying account privileges."; if(($groupNames -contains "domain admins") -or ($groupNames -contains "enterprise admins")) { Write-Host "`n The account has the privileges necessary to connect to the directory. `n" -Foregroundcolor green; } else { Write-Host "`n The account does not have the privileges necessary to connect to the directory. `n" -Foregroundcolor yellow; }
<#check ports#> $serviceName = "PortTest" $allTcpPorts = @(389,636,3268,3269,88,53,445,135,5722,464,9389,139) $allUdpPorts = @(389,88,53,445,123,464,138,2535,137) Write-Host "======================================="; Write-Host "Start to check ports `n"; Write-Host "In order to create an additional domain controller, please make sure all of the following ports are open. This test may take a while. `n";
foreach ($tcpPort in $allTcpPorts) { try { $cmd = "PortQry.exe"; $argList = "-n $domainName -e $tcpPort -p TCP"; $fileName = $serviceName + "output-TCP-$tcpPort.txt"; Start-Process "$cmd" "$argList" -NoNewWindow -RedirectStandardOutput "$fileName" -Wait; $content = Get-Content "$fileName"; $portListen = $content | Select-String "LISTENING"; $portNotListen = $content | Select-String "NOT LISTENING"; $portFiltered = $content | Select-String "FILTERED";
if(($portListen -ne $NULL) -and ($portNotListen -eq $NULL) -and ($portFiltered -eq $NULL)) { $result = $domainName + " has TCP " + $tcpPort + " Open"; Write-Host $result; }else { $result = $domainName + " has TCP " + $tcpPort + " Closed"; Write-Host $result -ForegroundColor yellow; } } catch [Exception] { Write-Host "`n" $_.Exception.ToString() -ForegroundColor red; break; } }
foreach ($udpPort in $allUdpPorts) { try { $cmd = "PortQry.exe"; $argList = "-n $domainName -e $udpPort -p UDP"; $fileName = $serviceName + "output-UDP-$udpPort.txt"; Start-Process "$cmd" "$argList" -NoNewWindow -RedirectStandardOutput "$fileName" -Wait; $content = Get-Content "$fileName"; $portListen = $content | Select-String "LISTENING"; $portNotListen = $content | Select-String "NOT LISTENING"; $portFiltered = $content | Select-String "FILTERED";
if(($portListen -ne $NULL) -and ($portNotListen -eq $NULL) -and ($portFiltered -eq $NULL)) {
$result = $domainName + " has UDP " + $udpPort + " Open";
Write-Host $result;
}else {
$result = $domainName + " has UDP " + $udpPort + " Closed";
Write-Host $result -ForegroundColor yellow;
}
} catch [Exception] {
Write-Host "`n" $_.Exception.ToString() -ForegroundColor red;
break;
}
}
[/PowerShell]
check.ps1として実行します。途中、資格情報を求められます。Administratorの資格情報を入力します。 以下のような結果が返ってきます。
[PowerShell]
PS C:\Users\Administrator> C:\PortQryV2\check.ps1
Please enter the domain name: hoge.local
コマンド パイプライン位置 1 のコマンドレット Get-Credential 次のパラメーターに値を指定してください: Credential ======================================= Checking domain name, user name, and password
======================================= Checking forest functional level
The forest functional level is Windows8Forest
The forest functional level is correct.
======================================= Checking domain functional level.
The domain functional level is: Windows8Domain
The domain functional level is correct.
======================================= Verifying account privileges.
The account has the privileges necessary to connect to the directory.
======================================= Start to check ports
In order to create an additional domain controller, please make sure all of the following ports are open. This test may take a while.
hoge.local has TCP 389 Open
hoge.local has TCP 636 Open
hoge.local has TCP 3268 Open
hoge.local has TCP 3269 Open
hoge.local has TCP 88 Open
hoge.local has TCP 53 Open
hoge.local has TCP 445 Open
hoge.local has TCP 135 Open
hoge.local has TCP 5722 Closed
hoge.local has TCP 464 Open
hoge.local has TCP 9389 Open
hoge.local has TCP 139 Closed
hoge.local has UDP 389 Closed
hoge.local has UDP 88 Closed
hoge.local has UDP 53 Open
hoge.local has UDP 445 Closed
hoge.local has UDP 123 Closed
hoge.local has UDP 464 Closed
hoge.local has UDP 138 Closed
hoge.local has UDP 2535 Closed
hoge.local has UDP 137 Closed
PS C:\Users\Administrator>
[/PowerShell]
以上でActive Directoryの設定は完了です。
次は、WorkSpaces側の準備をします。
WorkSpacesの準備
Active Directoryに接続するには、WorkSpaces Connectを選択します。
事前にActive Directory側にユーザー(wsadmin)をグループ(WorkSpaces_Connectors)にて作成しておきます。
入力項目を入れます。
フィールド | 値 |
---|---|
Organization | 会社名 |
Drirectory name | ドメイン |
NetBIOS(short) name | NetBIOS名 |
Account username | 事前作成したユーザー |
Account password | 事前作成したユーザーのパスワード |
DNS address | Active DrirectoryのIPアドレス |
VPC | VPC |
Subnets | 利用するサブネット2つ選択 |
WorkSpacesを起動する
接続するディレクトリを選択します。
その後接続するためのユーザーを検索します。
ユーザーは事前に作成する必要があります。アカウント名とEメールは入力しておきましょう。
利用するプランを選択します。
以上でWorksSpacesが利用できるようになります。
ただし、起動後20分程度たってから接続する必要があります。
接続には下記のURLからクライアントをダウンロードし、インストールを行います。 http://clients.amazonworkspaces.com/
registration codeを入力します。
Active Directoryで作成したユーザーでサインインします。
ユーザーでログインできていることが確認できます。
また、NATインスタンスの設定を行うことでインターネットへの接続も可能となります。
以上で、Active Directoryを使用したWorkSpacesの利用方法を紹介しました。
まとめ
今回はEC2でActive Directoryを構築し、WorkSpacesで利用する方法を紹介しましたが、当然オンプレのActive Directoryでも可能です。
今後はシンクライアントなどとの連携も期待されます。